package com.hhkj.admin.sale.service.base;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.hhkj.admin.sale.common.cont.SaleAccountConst;
import com.hhkj.admin.sale.domain.SaleAccount;
import com.hhkj.admin.sale.domain.SaleCommission;
import com.hhkj.admin.sale.model.dopo.SaleAccountDo;
import com.hhkj.admin.sale.model.dopo.SaleAccountPo;
import com.ruoyi.common.base.biz.service.base.BaseService;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author admin
 */
public interface SaleAccountService extends BaseService<SaleAccount, SaleAccountDo, SaleAccountPo> {

    /**
     * 根据销售id获取销售账户信息
     *
     * @param saleId 销售id
     * @return 销售账户信息
     */
    SaleAccountPo getPoBySaleId(Long saleId);

    /**
     * 初始化账户信息
     *
     * @param saleId 销售id
     * @return 账户信息
     */
    SaleAccount initAccount(Long saleId);

    /**
     * 根据销售id获取销售账户信息
     *
     * @param saleId 销售id
     * @return 账户信息
     */
    SaleAccount getBySaleId(Long saleId);

    /**
     * 增加佣金
     *
     * @param saleId 销售
     * @param price  金额
     * @return
     */
    boolean addTotalPrice(Long saleId, BigDecimal price);

    /**
     * 减少佣金
     *
     * @param saleId 销售
     * @param price  金额
     * @return
     */
    boolean subTotalPrice(Long saleId, BigDecimal price);

    /**
     * 增加余额
     *
     * @param saleId 销售id
     * @param price  增加的金额
     * @return
     */
    boolean addBalance(Long saleId, BigDecimal price);

    /**
     * 减少余额
     *
     * @param saleId 销售id
     * @param price  减少的金额
     * @return
     */
    boolean subBalance(Long saleId, BigDecimal price);

    /**
     * 根据佣金累加余额
     *
     * @param saleCommissionList 佣金列表
     * @return
     */
    boolean addBalanceByCommissionBatch(List<? extends SaleCommission> saleCommissionList);

    /**
     * 邀请人数自增
     * @param saleId
     * @return
     */
    boolean incInvitation(Long saleId);

    /**
     * 添加修改字段
     * @param updateWrapper 原有的条件
     * @param inc 增量
     * @param updateField 需要修改的字段
     * @param updateMethod 需要使用的方法(加减乘除)
     * @return
     */
    LambdaUpdateWrapper<SaleAccount> addAtomicUpdate(LambdaUpdateWrapper<SaleAccount> updateWrapper,
                                                            BigDecimal inc,
                                                            SaleAccountConst.UpdateField updateField,
                                                            SaleAccountConst.UpdateMethod updateMethod);

}
